/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package saa.dao;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import lib.BCrypt;
import saa.dominio.Curso;
import saa.dominio.disciplina.Disciplina;
import saa.dominio.periodo.OfertaDisciplina;
import saa.dominio.periodo.UnidadeDisciplina;
import saa.dominio.periodo.aluno.AvaliacaoAluno;
import saa.dominio.periodo.aluno.OfertaDisciplinaAluno;
import saa.dominio.periodo.aluno.UnidadeDisciplinaAluno;
import saa.dominio.periodo.tempo.Ano;
import saa.dominio.periodo.tempo.Bimestre;
import saa.dominio.periodo.tempo.Semestre;
import saa.dominio.usuario.Aluno;
import saa.dominio.usuario.Coordenador;
import saa.dominio.usuario.Usuario;
import saa.fachada.OfertaAlunoFachada;

@Stateless
public class PopularBanco implements PopularBancoInterface, Serializable {

    @PersistenceContext(unitName = "SAAPU")
    private EntityManager em;

    @EJB
    private OfertaAlunoFachada ofertaAlunoFachada;

    @Override
    public void popularBanco() {
        try {

            SimpleDateFormat formatoData = new SimpleDateFormat("dd/MM/yyyy");

            Ano ano = new Ano(2014, formatoData.parse("05/05/2014"), formatoData.parse("20/03/2015"));
            em.persist(ano);

            Semestre primeiroSemestre = new Semestre(ano, ano.getInicio(), formatoData.parse("26/09/2014"));
            em.persist(primeiroSemestre);

            Semestre segundoSemestre = new Semestre(ano, formatoData.parse("16/10/2014"), ano.getFim());
            em.persist(segundoSemestre);

            Bimestre primeiroBimestre = new Bimestre(primeiroSemestre, primeiroSemestre.getInicio(), formatoData.parse("20/07/2014"));
            em.persist(primeiroBimestre);
            Bimestre segundoBimestre = new Bimestre(primeiroSemestre, formatoData.parse("21/07/2014"), primeiroSemestre.getFim());
            em.persist(segundoBimestre);

            primeiroSemestre.addBimestre(primeiroBimestre);
            primeiroSemestre.addBimestre(segundoBimestre);

            Bimestre terceiroBimestre = new Bimestre(segundoSemestre, segundoSemestre.getInicio(), formatoData.parse("04/01/2015"));
            em.persist(terceiroBimestre);

            Bimestre quartoBimestre = new Bimestre(segundoSemestre, formatoData.parse("05/01/2015"), segundoSemestre.getFim());
            em.persist(quartoBimestre);

            segundoSemestre.addBimestre(terceiroBimestre);
            segundoSemestre.addBimestre(quartoBimestre);

            ano.addSemestre(primeiroSemestre);
            ano.addSemestre(segundoSemestre);
            // inserido periodos letivos /\

            String salt = BCrypt.gensalt();
            Usuario usuario = new Usuario("Coordenador", "coordenador@coordenador.com", BCrypt.hashpw("12345", salt), salt);
            em.persist(usuario);

            Curso curso = new Curso("TADS", 60, 20, 75);
            em.persist(curso);

            Coordenador coordenador = new Coordenador(curso, usuario);
            em.persist(coordenador);

            curso.setCoordenador(coordenador);

            Disciplina disciplina = new Disciplina("POO", 90, 120, "POO", curso);
            em.persist(disciplina);

            curso.addDisciplinas(disciplina);
            // inserida disciplina no curso /\

            OfertaDisciplina oferta = new OfertaDisciplina(disciplina, primeiroSemestre, new ArrayList<UnidadeDisciplina>());
            em.persist(oferta);

            UnidadeDisciplina unidadeUm = new UnidadeDisciplina(primeiroBimestre, oferta, 40);
            em.persist(unidadeUm);
            UnidadeDisciplina unidadeDois = new UnidadeDisciplina(segundoBimestre, oferta, 40);
            em.persist(unidadeDois);

            oferta.addUnidade(unidadeUm);
            oferta.addUnidade(unidadeDois);
            // disciplina ofertada /\

            salt = BCrypt.gensalt();
            Usuario usuario2 = new Usuario("Aluno", "aluno@aluno.com", BCrypt.hashpw("12345", salt), salt);
            em.persist(usuario2);
            Aluno aluno = new Aluno(usuario2, curso);
            aluno.setObjetivoNota(90);
            aluno.setObjetivoPercentualPresencas(85);

            em.persist(aluno);
            OfertaDisciplinaAluno ofertaAluno = new OfertaDisciplinaAluno(oferta.getDisciplina().getCurso().getNotaMinimaParaPassar(), oferta.getDisciplina().getCurso().getPercentualPresencaMinimo() * disciplina.getCargaHorariaAula() / 100, oferta, aluno);

            if (aluno.getObjetivoNota() > ofertaAluno.getObjetivoNota()) {
                ofertaAluno.setObjetivoNota(aluno.getObjetivoNota());
            }

            if (aluno.getObjetivoPercentualPresencas() * oferta.getDisciplina().getCargaHorariaAula() / 100 > ofertaAluno.getObjetivoPresencas()) {
                ofertaAluno.setObjetivoPresencas(aluno.getObjetivoPercentualPresencas() * oferta.getDisciplina().getCargaHorariaAula() / 100);
            }
            // /\ sobrescreve os valores padrão do curso com os do aluno se maior

            em.persist(ofertaAluno);
            aluno.addDisciplina(ofertaAluno);
            for (UnidadeDisciplina unidade : oferta.getUnidades()) {
                UnidadeDisciplinaAluno unidadeAluno = new UnidadeDisciplinaAluno(ofertaAluno, unidade, 0, 0, ofertaAluno.getObjetivoNota(), ofertaAluno.getObjetivoPresencas() / 2);
                em.persist(unidadeAluno);
                ofertaAluno.addBimestre(unidadeAluno);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void alterarBanco() {
        try {
            SimpleDateFormat formatoData = new SimpleDateFormat("dd/MM/yyyy");

            ofertaAlunoFachada.adicionarAvaliacao(1, 4, formatoData.parse("26/07/2014"));
            ofertaAlunoFachada.adicionarAvaliacao(1, 5, formatoData.parse("28/07/2014"));
            ofertaAlunoFachada.adicionarAvaliacao(1, 10, formatoData.parse("30/07/2014"));
            ofertaAlunoFachada.adicionarAvaliacao(1, 6, formatoData.parse("05/08/2014"));
            
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    public void inserirNota() {
        AvaliacaoAluno avaliacaoAluno = em.find(AvaliacaoAluno.class, 6);
        avaliacaoAluno.setNota(92);
    }

}
